#pragma once
#include<iostream>
#include<string>
#include<functional>
#include<memory>
#include"InetAddr.hpp"

using func_t=std::function<void()>;//TODO

class epollserver;

class Connection
{
public:
    Connection(int sockfd):_sockfd(sockfd)
    {}
    void InitCB(func_t recver,func_t sender,func_t exceptr)
    {
        _recver=recver;
        _sender=sender;
        _exceptr=exceptr;
    }
    void SetPeerInfo(const InetAddr addr)
    {
        _addr=addr;
    }
    int Sockfd()
    {
        return _sockfd;
    }
    void SetEvents(uint32_t events)
    {
        _events=events;
    }
    uint32_t GetEvents()
    {
        return _events;
    }

    void CallRecv()
    {
        if(_recver!=nullptr)
            _recver();
    }
    void CalSend()
    {
        if(_sender!=nullptr)
            _sender();
    }
    ~Connection()
    {}
private:
    int _sockfd;
    std::string _inbuffer;//输入缓冲区
    std::string _outbuffer;//输出缓冲区
    InetAddr _addr;//对端地址

    //回调函数
    func_t _recver;//接收到数据时的回调函数
    func_t _sender;//发送数据时的回调函数
    func_t _exceptr;//异常时的回调函数


    //添加一个指针
    epollserver *_owner;//拥有者

    //我关心的事件
    uint32_t _events;//Connection关心的事件


};


class Factory
{
public:
    static std::shared_ptr<Connection> CreateConnection(int sockfd,uint32_t events,func_t r,func_t s,func_t e)
    {
        auto conn=std::make_shared<Connection>(sockfd);
        conn->SetEvents(events);
        conn->InitCB(r,s,e);
        return conn;
    }
};